/**
 * jquery-ajaxcombobox-1.0.js
 * 
 * @since 1.0 <2017-3-17> SoChishun <14507247@qq.com> 由ajax-combobox-1.0.js(2014-6-17)重构
 */
// example:
// <td class="status"><a href="{:AddonU('change_status','id='.$vo['id'].'&status=varstatus')}" title="点击隐藏" data-value="{$vo.status}" class="text-success"><i class="fa fa-check fa-fw"></i></a></td>
// $('td.status a').togglelink();
(function ($) {
    // 用户快速批量编辑，每条记录可以独立编辑，如快速批量编辑用户角色、部门等，每个用户可以独立设置下拉框
    $.fn.ajaxcomboboxes = function (options) {
        // 插件初始化
        var opt = $.extend({}, $.fn.ajaxcombobox.defaults, options);
        var jCollection = this;
        if (!opt.url) {
            jCollection.each(function () {
                if (!opt.url && $(this).data('url')) {
                    opt.url = $(this).data('url'); // 设置url
                }
            })
        }
        if (!opt.url) {
            console.log('[ajaxcomboboxes]配置url无效');
            return;
        }
        $.getJSON(opt.url, opt.queryParams, function (data) {
            if (!data) {
                return;
            }
            var $data;
            try {
                $data = (typeof (data) == "object") ? data : new Function("return " + data)();
            } catch (e) {
                console.log(e);
            }
            var str = '';
            str = $.fn.ajaxcomboboxGenerateOptions($data);
            if (opt.prepends) {
                str = $.fn.ajaxcomboboxGenerateOptions(opt.prepends) + str;
            }
            if (opt.appends) {
                str = str + $.fn.ajaxcomboboxGenerateOptions(opt.appends);
            }
            if (opt.first) { // 添加默认选项到第一行
                str = $.fn.ajaxcomboboxGenerateOption(opt.first) + str;
            }
            jCollection.each(function () {
                var $this = $(this);
                $this.empty(); // 清空所有option控件
                $this.html(str);
                var value = $this.data('value');
                if (value && value.length > 4 && value.substring(0, 4) == 'TXT:') {
                    $this.find('option:contains("' + value.substring(4) + '")').prop('selected', true);
                } else {
                    $this.find('option[value="' + value + '"]').prop('selected', true);
                }
                str = $this.html();
                // 如果有定义函数则执行
                if (opt.func) {
                    opt.func(str);
                }
            })
        });
        this.each(function () {
            var $this = $(this);
        })
    };
    $.fn.ajaxcombobox = function (options) {
        // 插件初始化
        var opt = $.extend({}, $.fn.ajaxcombobox.defaults, options);
        return this.each(function () {
            var $this = $(this);
            if (!opt.url) {
                opt.url = $this.data('url'); // 设置url
            }
            console.log(opt.url);
            if (!opt.url) {
                console.log('[ajaxcombobox]配置url无效');
                return;
            }
            if (!opt.value) {
                opt.value = $this.data('value'); // 设置value
            }
            $.getJSON(opt.url, opt.queryParams, function (data) {
                $this.empty(); // 清空所有option控件
                if (!data) {
                    return;
                }
                var $data;
                try {
                    $data = (typeof (data) == "object") ? data : new Function("return " + data)();
                } catch (e) {
                    console.log(e);
                }
                var str = '';
                str = $.fn.ajaxcomboboxGenerateOptions($data);
                if (opt.prepends) {
                    str = $.fn.ajaxcomboboxGenerateOptions(opt.prepends) + str;
                }
                if (opt.appends) {
                    str = str + $.fn.ajaxcomboboxGenerateOptions(opt.appends);
                }
                if (opt.first) { // 添加默认选项到第一行
                    str = $.fn.ajaxcomboboxGenerateOption(opt.first) + str;
                }
                $this.html(str);
                if (opt.value && opt.value.length > 4 && opt.value.substring(0, 4) == 'TXT:') {
                    $this.find('option:contains("' + opt.value.substring(4) + '")').prop('selected', true);
                } else {
                    $this.find('option[value="' + opt.value + '"]').prop('selected', true);
                }
                str = $this.html();
                // 如果有定义函数则执行
                if (opt.func) {
                    opt.func(str);
                }
            });
        });
    };

    /**
     * 根据json数据生成option树形控件
     * 如果有children节点则自动生成树形数据
     * @param {JSON} data
     * @param {int} n 节点深度
     * @param {string} char 节点名称前缀
     * @returns {string}
     * @since 1.0 2014-8-22 by sutroon
     * @since 1.1 <2015-10-22> SoChishun 修正前置符号错位问题
     * @example
     *      var data = (typeof (data) == "object") ? data : $.parseJSON(data);
     *      var str = '';
     *      str=generate_options(data);
     */
    $.fn.ajaxcomboboxGenerateOptions = function (data, n, char) {
        if (undefined == n) {
            n = 0;
        }
        if (undefined == char) {
            char = '....';
        }
        var pad = '';
        var x = n + 1;
        while (n > 0) {
            pad += char;
            n--;
        }
        var str = '';
        if (data.length) {
            // 多行格式
            for (var i = 0; i < data.length; i++) {
                if (data[i].id) {
                    // 用于[{"id":"1","text":"name1"}]格式                
                    str += '<option value="' + data[i].id + '">' + pad + (data[i].text ? data[i].text : data[i].text) + '</option>';
                } else if (data[i].item) {
                    // 用于[{"item":"1"},{"item":"2"}]
                    str += '<option value="' + data[i].item + '">' + pad + data[i].item + '</option>';
                } else {
                    // 用于["item1","item2"]格式
                    str += '<option value="' + data[i] + '">' + pad + data[i] + '</option>';
                }
                if (data[i].children) {
                    str += $.fn.ajaxcomboboxGenerateOptions(data[i].children, x, char);
                }
                n = 0;
            }
        } else {
            // 用于{"a":"a1","b":"b2"}单行格式
            for (var attr in data) {
                str += '<option value="' + attr + '">' + data[attr] + '</option>';
            }
        }
        return str;
    };
    $.fn.ajaxcomboboxGenerateOption = function (data, char) {
        var value = '';
        var text = '';
        // 用于{"a":"a1","b":"b2"}单行格式
        var i = 0;
        for (var attr in data) {
            if (i < 1) {
                value = data[attr];
            } else {
                text = data[attr];
            }
            i++;
        }
        return '<option value="' + value + '">' + (char ? char : '') + text + '</option>';
    };
    /**
     * 默认配置
     * @since 1.0 <2017-3-17> SoChishun Added.
     */
    $.fn.ajaxcombobox.defaults = {
        url: null, // string:ajax数据源地址,为空则会读取data-url属性
        queryParams: {}, // json:查询参数
        value: null, // string:默认值,null则会读取data-value属性
        first: [], // json-array:默认第一行显示的文本,如:[{"id":"","text":"请选择..."}]
        prepends: [], // json-array:添加的额外options,如果加前缀+则追加到后面,默认追加到前面
        appends: [], // json-array:添加的额外options,如果加前缀+则追加到后面,默认追加到前面
        func: null, // function(str):ajax加载完成后执行的方法
    };
})(jQuery);